Week11
影片連結: https://www.youtube.com/watch?v=hiw8xg1cV4M&t=11s
process explanation
下列的圖面解說如下
以上圖的 if then else end 來說,根據 lua language ,先用 if 給予假設我要的條件,接著寫上 then 後並執行我要的動作,再來是 else 是用完上面 if then 才接著告訴它我的假設並不是如上面的 if then 的話,所以是用來額外假設我上個假設是錯的,並執行其他的動作,寫完 else 後在給予 end ,是為了將一個迴圈封閉,有了開始也必須要結束的概念。
由上圖所示有紅字的部分是對括號中的項目進行指定,像是sim.setJointTargetPosition(joint, velocity),是指模擬並設定旋轉軸的目標位置為(旋轉軸 , 速度)這樣作為解釋。
上圖還有類似黃色的字樣是指,我針對地物件是圖面上的什麼東西,像是joint=sim.getObjectHandle('left_joint'),是指 joint = 模擬並得到項目的處理('left_joint')這麼解釋的。
上圖還有給予參數,像是速度 = 0、人偶回程 = 0、扭矩 = 0,還有滑動過程 = 0。
上圖的這條程式碼是要關閉整個 lua system 的程式,這樣才能流通為一個正常的一串程式碼,那這樣的寫法是要讓他一直跑一整條所寫下的程式。
上圖所示為桿件的連接方式,以V-rep來說,每一個物件想要讓它旋轉或是平移都需要在途中給予物件連接性,以上突來講,我想讓物件既可旋轉也可以平移,所以我在 joint 跟 slider 之間放置一個物品,最主要是以裡面的物件程式,它會判定要求要有物件連結才能進行物理運動,相同的我也必須要套用人偶,所以我在 slider 跟 player 之間又放入一個實體物件,進行串聯,這樣才不會因為 player 為 skin 的關係而造成錯誤。
------------------------------------------------------------------------------------------
Week12
影片連結: https://www.youtube.com/watch?v=TYlWAmBfWuU&t=46s
process explanation
延續上周所提到紅字的部分,像是sim.addStatusbarMessage('sliding:'..sliding)是指模擬時加入狀態訊息('指定上方條件滑動過程:' .. 滑動過程)在模擬的下方訊息顯示出平移滑動時的增減平移距離。
上圖所示有多數的桿件都放入上面兩張的程式碼各別放置到各個桿件中,事實上這是其中一個方法,但仍然是建議將全部的迴圈寫入至同一個程式碼流程內會更好,以V-rep來說寫入子程式應該是對於部分桿件的各自編寫細節,而不是將主要程式寫入子程式,本體的程式則是得寫入全部的桿件並做動的迴圈指令才是正確的,然而在這周我是將封閉地程式碼各別放入桿件子程式中,且主程式為空的狀態。
----------------------------------------------------------------
Week13
影片連結: https://www.youtube.com/watch?v=BOwD2FSJiyg
process explanation
以上圖 local 的陣列給予指定,
像是 local joint_b = {'left_joint','left_joint2','left_joint3','left_joint4'} 來說是指,對 joint 做局部陣列定義並等於 { 'left_joint','left_joint2','left_joint3','left_joint4'} 這些。
以上圖紅字,像是 joint_all_x1=sim.getObjectHandle(joint_b[1]) ,是要告訴它joint_all_x1 = 模擬項目處理(上面 joint_b 陣列中的 'left_joint') 的意思。
上圖的平移範圍設定,像是 if (sliding_b >= 0.35) then 、else sliding_b = sliding_b + 0.05,是要假設 (sliding_b大於等於0.35) 後,告訴它 sliding_b = sliding_b +0.05 的平移距離。
以上圖的紅字設定是各別給予針對地速度 (名稱 , 速度) 或是滑動過程 (名稱, 滑動)。
以上圖所示,是在給予指定的物樣在模擬時得到項目的處理 (上面 local 所針對的陣列),再給予參數,速度 = 0、人偶回程 = 0、扭矩 = 0、滑動過程_a = 0、滑動過程_b = 0,接著給 旋轉軸方向 跟 人偶位置 的讀取 () ,最後再關閉 lua 完成這整串程式。
以上的四張圖為主程式碼的部分,與上周的不同是將程式碼寫成封閉單個並各別放入各自桿件的子程式。
-----------------------------------------------------------------------
Week14
影片連結: https://www.youtube.com/watch?v=8oRFduQYJLk
process explanation
上圖為本組 onshape 設計的足球場,前面幾周因為單獨使用程式而已,所以還沒直接丟入圖面,現在是有將圖檔複製後再載並轉為 .stl 檔匯進 V-rep 中並簡化,那過程是順利地與程式套用
上圖為這些桿件跟圖檔簡化後圖元連結的詳細結構狀態,這次在 slider 放入桿子 pole 為實際模擬真實的手足球檯的控制桿可以平移連動,再給予 people 到 pole 的連接下方。
---------------------------------------------------------------------------
Week15 to Week16
human and human
process explanation
以上圖解釋:
velocity = 0 是要求 init 要輸入速度的這個條件給系統。
sliding_b = 0 也跟上方的velocity = 0 概念是一樣的要輸入給系統。
sim.getOjectHandle (' ') 是指處理物件的相關。
sim.setJointTargetPosition( , ) 是指設定軸的目標位置(上方處理完的物件 , 給予速度或是其他的條件 )。
上圖所示:
message,auxiliaryData=sim.getSimulatorMessage() 是指訊息 , 輔助參數或是數據 = 模擬得到模擬器訊息。
while message ~= -1 do 是指當訊息為非 -1 得做以下的。
key=auxiliaryData[1] 是指 key = 輔助數據陣列 [1],
sim.addStatusbarMessage('key:'..key) 是指模擬時新增狀態訊息為 key在下方狀態顯示。
velocity = 速度大小 ( 負號單純是指方向 )。
以上方兩圖所示:
if (auxiliaryData[1]==97) then
-- left key
if (sliding_b >= 0.2) then
else sliding_b = sliding_b + 0.05
sim.addStatusbarMessage('sliding_b:'..sliding_b)
end
end
if (假設輔助數據等於按鍵 = true時) then (接著)
[ if (假設sliding_b >= 0.2 =true時) then (接著)
[執行某事要求]
else (如果上方假設 = false ,要求 slideing_b = sliding_b +0.05平移位移)
模擬新增狀態訊息sliding_b的狀態在下方訊息欄呈現。
end(結束此迴圈) ]
end(結束回圈)。
message,auxiliaryData=sim.getSimulatorMessage() 是指從上方的這行指令到下方這行指令之間的所有程式皆啟用 訊息 , 輔助數據 = 模擬時得到模擬器的訊息。
----------------------------
human and computer
process explanation
上圖所示:
velocity = 0 是要求 init 要輸入速度的這個條件給系統。
sliding_b = 0 也跟上方的velocity = 0 概念是一樣的要輸入給系統。
sim.getOjectHandle (' ') 是指處理物件的相關。
sim.setJointTargetPosition( , ) 是指設定軸的目標位置(上方處理完的物件 , 給予速度或是其他的條件 )。
上圖所示:
message,auxiliaryData=sim.getSimulatorMessage() 是指 訊息 , 輔助參數或是數據 = 模擬得到模擬器訊息。
while message ~= -1 do 是指當訊息為非 -1 得做以下的。
key=auxiliaryData[1] 是指 key = 輔助數據陣列 [1],
sim.addStatusbarMessage('key:'..key) 是指模擬時新增狀態訊息為 key在下方狀態顯示。
velocity = 速度大小 ( 負號單純是指方向 )。
if (auxiliaryData[1]==97) then
-- left key
if (sliding_b >= 0.2) then
else sliding_b = sliding_b + 0.05
sim.addStatusbarMessage('sliding_b:'..sliding_b)
end
end
if (假設輔助數據等於按鍵 = true時) then (接著)
[ if (假設sliding_b >= 0.2 =true時) then (接著)
[執行某事要求]
else (如果上方假設 = false ,要求 slideing_b = sliding_b +0.05平移位移)
模擬新增狀態訊息sliding_b的狀態在下方訊息欄呈現。
end(結束此迴圈) ]
end(結束回圈)。
上圖所示:
message,auxiliaryData=sim.getSimulatorMessage() 是指從上方的這行指令到下方這行指令之間的所有程式皆啟用 訊息 , 輔助數據 = 模擬時得到模擬器的訊息。
position_PR=sim.getObjectPosition(right_pole_r1,-1)
position_S=sim.getObjectPosition(Sphere_handle,-1)
X = position_S[1] - position_PR[1]
Y = position_S[2] - position_PR[2]
if 1 then
if X <= -0.05 then --goalkeeper
sim.setJointTargetVelocity(right_joint_r1,-5)
elseif X > -0.05 then
sim.setJointTargetVelocity(right_joint_r1,5)
end
Y = Y*5
sim.setJointTargetVelocity(right_slider_r1,Y)
end
桿子位置 = 模擬得到物件位置(處理的物件 , -1啟動)。
球的位置 = 模擬得到物件位置(處理的物件 , -1啟動)。
X = 球的位置 - 桿件的位置 (在X軸上)。
Y = 球的位置 - 桿件的位置 (在Y軸上)。
if (假設 1 = true) then (接著)
[ if (假設X <= -0.05) 接著
模擬設定軸的目標速度 ( 處理後的物件 , 速度大小(負號是指方向))
elseif (額外假設 X > -0.05) 接著
模擬設定軸的目標速度 (處理後的物件 , 速度大小)
end (結束此迴圈) ]
Y = 上方 Y軸的位置差 * 上5倍
模擬設定軸的目標速度 (處理後的物件 , 為上方 Y 的追蹤速度)
end (結束迴圈)。
以上方兩張圖所示:
position_PR=sim.getObjectPosition(right_pole_r2,-1)
position_S=sim.getObjectPosition(Sphere_handle,-1)
X = position_S[1] - position_PR[1]
Y = position_S[2] - position_PR[2] + 0.1
Y2 = position_S[2] - position_PR[2] - 0.1
if X >= -1 then --goalkeeper
if position_S[2] <= 0.1 then
if X <= -0.05 then
sim.setJointTargetVelocity(right_joint_r2,-5)
elseif X > -0.05 then
sim.setJointTargetVelocity(right_joint_r2,5)
end
Y = Y*5
sim.setJointTargetVelocity(right_slider_r2,Y)
elseif position_S[2] > 0.1 then
if X <= -0.05 then
sim.setJointTargetVelocity(right_joint_r2,-5)
elseif X > -0.05 then
sim.setJointTargetVelocity(right_joint_r2,5)
end
Y2 = Y2*5
sim.setJointTargetVelocity(right_slider_r2,Y2)
end
end
桿子位置 = 模擬得到物件位置(處理的物件 , -1啟動)。
球的位置 = 模擬得到物件位置(處理的物件 , -1啟動)。
X = 球的位置 - 桿件的位置 (在X軸上)。
Y = 球的位置 - 桿件的位置再+ 0.1(在Y軸上)。
Y2= 球的位置 - 桿件的位置再 - 0.1(在Y軸上)。
if (假設X>= -1 = true ) then (接著)
{ if (假設球在Y軸時 <= 0.1 = true) then (接著)
[ if (假設X <= -0.05時 = true) then (接著)
模擬設定軸的目標速度(處理後的物件 , 速度大小(負號為方向))
elseif (額外假設X> -0.05時 = true ) then (接著)
模擬設定軸的目標速度(處理後的物件 , 速度大小)
end (結束此迴圈) ]
Y = 上方Y在Y軸的位置差*5倍
模擬設定的目標速度(處理後的物件 , Y的追蹤速度大小)
elseif (額外假設求在Y軸上 > 0.1) then (接著)
[ if (假設X <= -0.05時 = true) then (接著)
模擬設定軸的目標速度(處理後的物件 , 速度大小(負號為方向))
elseif (額外假設X> -0.05時 = true ) then (接著)
模擬設定軸的目標速度(處理後的物件 , 速度大小)
end (結束此迴圈) ]
Y2 = 上方Y2 在Y軸位置差* 5倍
模擬設定軸的目標速度(處理後的物間 , 上方 Y2 追蹤的速度大小)
end (結束此迴圈) }
end(結束迴圈)。
--------------------------
computer and computer
process explanation
以上圖所示:
sim.getOjectHandle (' ') 是指處理物件的相關。
以上方所有圖示:
下方程式為 goal keeper 的部分
position_PR=sim.getObjectPosition(right_pole_r1,-1)
position_S=sim.getObjectPosition(Sphere_handle,-1)
X = position_S[1] - position_PR[1]
Y = position_S[2] - position_PR[2]
if 1 then
if X <= -0.05 then --goalkeeper
sim.setJointTargetVelocity(right_joint_r1,-5)
elseif X > -0.05 then
sim.setJointTargetVelocity(right_joint_r1,5)
end
Y = Y*5
sim.setJointTargetVelocity(right_slider_r1,Y)
end
桿子位置 = 模擬得到物件位置(處理的物件 , -1啟動)。
球的位置 = 模擬得到物件位置(處理的物件 , -1啟動)。
X = 球的位置 - 桿件的位置 (在X軸上)。
Y = 球的位置 - 桿件的位置 (在Y軸上)。
if (假設 1 = true) then (接著)
[ if (假設X <= -0.05) 接著
模擬設定軸的目標速度 ( 處理後的物件 , 速度大小(負號是指方向))
elseif (額外假設 X > -0.05) 接著
模擬設定軸的目標速度 (處理後的物件 , 速度大小)
end (結束此迴圈) ]
Y = 上方 Y軸的位置差 * 上5倍
模擬設定軸的目標速度 (處理後的物件 , 為上方 Y 的追蹤速度)
end (結束迴圈)。
下方程式包刮 (guard midfield forward)的部分
position_PR=sim.getObjectPosition(right_pole_r2,-1)
position_S=sim.getObjectPosition(Sphere_handle,-1)
X = position_S[1] - position_PR[1]
Y = position_S[2] - position_PR[2] + 0.1
Y2 = position_S[2] - position_PR[2] - 0.1
if X >= -1 then --goalkeeper
if position_S[2] <= 0.1 then
if X <= -0.05 then
sim.setJointTargetVelocity(right_joint_r2,-5)
elseif X > -0.05 then
sim.setJointTargetVelocity(right_joint_r2,5)
end
Y = Y*5
sim.setJointTargetVelocity(right_slider_r2,Y)
elseif position_S[2] > 0.1 then
if X <= -0.05 then
sim.setJointTargetVelocity(right_joint_r2,-5)
elseif X > -0.05 then
sim.setJointTargetVelocity(right_joint_r2,5)
end
Y2 = Y2*5
sim.setJointTargetVelocity(right_slider_r2,Y2)
end
end
桿子位置 = 模擬得到物件位置(處理的物件 , -1啟動)。
球的位置 = 模擬得到物件位置(處理的物件 , -1啟動)。
X = 球的位置 - 桿件的位置 (在X軸上)。
Y = 球的位置 - 桿件的位置再+ 0.1(在Y軸上)。
Y2= 球的位置 - 桿件的位置再 - 0.1(在Y軸上)。
if (假設X>= -1 = true ) then (接著)
{ if (假設球在Y軸時 <= 0.1 = true) then (接著)
[ if (假設X <= -0.05時 = true) then (接著)
模擬設定軸的目標速度(處理後的物件 , 速度大小(負號為方向))
elseif (額外假設X> -0.05時 = true ) then (接著)
模擬設定軸的目標速度(處理後的物件 , 速度大小)
end (結束此迴圈) ]
Y = 上方Y在Y軸的位置差*5倍
模擬設定的目標速度(處理後的物件 , Y的追蹤速度大小)
elseif (額外假設求在Y軸上 > 0.1) then (接著)
[ if (假設X <= -0.05時 = true) then (接著)
模擬設定軸的目標速度(處理後的物件 , 速度大小(負號為方向))
elseif (額外假設X> -0.05時 = true ) then (接著)
模擬設定軸的目標速度(處理後的物件 , 速度大小)
end (結束此迴圈) ]
Y2 = 上方Y2 在Y軸位置差* 5倍
模擬設定軸的目標速度(處理後的物間 , 上方 Y2 追蹤的速度大小)
end (結束此迴圈) }
end(結束迴圈)。
守門員的程式與其他人的程式相差是在於,我設定的X軸跟Y軸的位置差所針對的部分是球的型心與桿子的型心所做的位置差,所以為了避免有空踢的可能性,所以必須在後衛、中場、前鋒上給予在Y軸上的彌補,其用意除了在空踢以外,還要避免當球員道極 限位置時要求另一個球員要去踢球,所以在第一大迴圈中給的X要>= -1是要求球員要在X軸為 1 的範圍內可以判定球的X軸在哪,第二個迴圈中,用球的Y軸 <=0.1時,要求Y的設定之人偶去追蹤球,額外的假設是當球的Y軸>0.1時,要求Y2的設定之人偶去追蹤球,第三迴圈,相對簡單,先告訴它假設 X < -0.05 時,要求欲踢狀態,額外假設X>-0.05 時,要求踢擊狀態,這是三層迴圈的內部定義。
----------------------------------------------------------------------------
Week17
期末報告影片 : https://www.youtube.com/watch?v=K63U3U_98Mk&t=4s